﻿namespace InvoiceInvoker.Logic
{
	public static class Validator
	{
		public static bool ValidateNip(string nipString)
		{
			long nip;

			if (long.TryParse(nipString, out nip))
			{
				int[] digitArray = nip.ToDigitArray();

				if (digitArray.Length == 10)
				{
					int sum = digitArray[0] * 6
							+ digitArray[1] * 5
							+ digitArray[2] * 7
							+ digitArray[3] * 2
							+ digitArray[4] * 3
							+ digitArray[5] * 4
							+ digitArray[6] * 5
							+ digitArray[7] * 6
							+ digitArray[8] * 7;

					if (sum % 11 == digitArray[9])
						return true;
				}
			}

			return false;
		}

		public static bool ValidateRegon(string regonString)
		{
			long regon;

			if (long.TryParse(regonString, out regon))
			{
				int[] digitArray = regon.ToDigitArray();

				if (digitArray.Length == 9)
				{
					int sum = digitArray[0] * 8
							+ digitArray[1] * 9
							+ digitArray[2] * 2
							+ digitArray[3] * 3
							+ digitArray[4] * 4
							+ digitArray[5] * 5
							+ digitArray[6] * 6
							+ digitArray[7] * 7;

					int mod = sum % 11;

					if (mod == 10)
						mod = 0;

					if (mod == digitArray[8])
						return true;
				}
				else if (digitArray.Length == 14)
				{
					int sum = digitArray[0] * 2
							+ digitArray[1] * 4
							+ digitArray[2] * 8
							+ digitArray[3] * 5
							+ digitArray[4] * 0
							+ digitArray[5] * 9
							+ digitArray[6] * 7
							+ digitArray[7] * 3
							+ digitArray[8] * 6
							+ digitArray[9] * 1
							+ digitArray[10] * 2
							+ digitArray[11] * 4
							+ digitArray[12] * 8;

					int mod = sum % 11;

					if (mod == 10)
						mod = 0;

					if (mod == digitArray[13])
						return true;
				}
			}

			return false;
		}

		private static int[] ToDigitArray(this long number) // e.g. converts 123456 to { 1, 2, 3, 4, 5, 6 } (most significant digit -> index 0)
		{
			string str = number.ToString();
			int[] digitArray = new int[str.Length];

			for (int i = 0; i != digitArray.Length; i++)
				digitArray[i] = int.Parse(str[i].ToString());

			return digitArray;
		}
	}
}
